
/**
* @brief  bsp_flash.c/h
* @param  读写内部flash的数据
* @author 颜福兵
* @date   2022/9/4
* 
**/

#include "bsp_flash.h"
#include "stm32f3xx_hal_flash.h"
#include "stm32f3xx_hal_flash_ex.h"

/**
 * @brief 读取两个字节
 * @param faddr 读取的地址
 * @return 地址里面的值
 */
uint32_t Flash_Readword(uint32_t faddr) {
  return *(volatile uint32_t*)faddr;
}

/**
 * @brief 从指定的位置开始读取数据
 * @param ReadAddr 开始读取的地址0x08000000-0x0803f800
 * @param flash_read 读取数据的结构体
 */
uint32_t Flash_ReadData(uint32_t ReadAddr) {
  return Flash_Readword(ReadAddr);//读取4个字节.
}

/**
 * @brief FLASH写入数据
 * @param addr 开始写入的地址
 * @param flash_write 要写入的数据的结构体
 */
void Flash_WriteData(uint32_t addr, uint32_t flash_write) {
  //1、解锁FLASH
  HAL_FLASH_Unlock();       //解锁
  FLASH_EraseInitTypeDef flash;
  flash.TypeErase = FLASH_TYPEERASE_PAGES;  //页擦擦和块擦除选择,标明Flash执行页面只做擦除操作
  flash.PageAddress =PARA_ADDR;       //声明要擦除的地址
  flash.NbPages = 1;              //说明要擦除的页数，此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值
  //一些MCU一页是1KB，一些MCU一页是2KB
  //设置PageError
  uint32_t PageError = 0;
  //调用擦除函数
  HAL_FLASHEx_Erase(&flash, &PageError);
  //3、对FLASH烧写
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *(volatile uint64_t*)&flash_write) != HAL_OK) {
      HAL_FLASH_Lock();  //上锁
  }
  
  //4、锁住FLASH
  HAL_FLASH_Lock();
}


////////////////////********************end of the file 

